<?php 
/* ──────────── 深度空间 深度学习 ──┐
深度学习(php)分页类	(PHP Page Engine)
Version:   0.1.7
作者：     吕海鹏 www.deepstudy.cn
建立时间： 2010-2-5	最后修改时间：2017-1-19
─────────────────── www.deepstudy.cn ──┘
*/
namespace library\page;
//$oPage=new Deep_Page($GLOBALS['db'],2);	 // pdo对象，每页显示记录数

/*
//1	 分页类包含(默认已包含)
	require './library/Deep.Page.class.php' ;

//2 放在SQL查询位置处 注意sql变量名一致
	$sql=   ----这里是原来的查询SQL----   ;
	$sql=$oPage->getPageSQL( $sql , 20 );//每页显示记录数

//3 分页导航 -----	
	echo $oPage->url_nav_easy();
	//echo $oPage->url_nav_all();
	//echo $oPage->url_nav_num();
	//echo $oPage->url_nav_page();
*/


class Deep_Page
{
	public $page_tag;	//page标签，用来控制url页。例xxx.php?deep_page=2中的deep_page
	public $pageSize;	//每页显示记录数 默认20条
	public $currentPage;	//当前页	
	public $resultCount;	//总计录数

	private $oMyConnection;	//pdo对象

	private $url_args;
	private $pageCount;//总页数

	function __construct($oConnection='',$pageSize=20){
		$this->page_tag='page';
		$this->currentPage=1;
		$this->pageSize=$pageSize;
		$this->oMyConnection=$oConnection;
	}
	
	/*	────────────── 深度空间 深度学习 ──┐
	方法名：getPageSQL()
	作  用：拼合分页SQL                  
	参  数： 
	说  明：
	日  期：2012/2/17  2015/1/19
	─────────────────── www.ruijiesoft.com ──┘
	*/
	public function getPageSQL($sql,$pageSize=null){
		if($pageSize!=null)$this->pageSize=$pageSize;
		// 获取总页数 $this->pageCount 记算总共有多少
		$this->resultCount=$this->countSQL(trim($sql));
		if( $this->resultCount >0 ){
			$this->pageCount = ceil($this->resultCount / $this->pageSize);
		}
		else{
			$this->pageCount = 0;
		}

		return $sql.'  limit '. $this->startResult() .",".$this->pageSize ;
	}

	/*	────────────── 深度空间 深度学习 ──┐
	方法名：startResult()
	作  用：sql limit查询开始记录                    
	参  数： 
	说  明：
	日  期：2010/3/17
	─────────────────── www.ruijiesoft.com 2009-7-30──┘
	*/
	private function startResult(){
		if( isset($_GET[$this->page_tag]) ){
			$this->currentPage = intval( $_GET[$this->page_tag] );		//intval -- 获取变量的整数值
		}
		return ($this->currentPage-1)*$this->pageSize ;
	}

	/*	────────────── 深度空间 深度学习 ──┐
	函数名：countSql()
	作  用：总记录数                     
	参  数：
	说  明：	正则SQL语句执行 返回 总记录数 
	日  期：2010-2-5  2012-2-17
	─────────────────── www.deepstudy.cn ──┘
	*/
    private function  countSQL($sql){
		$sql= preg_replace( '/^select[\s\*\w,\.]+(from)/iU',  'select count(*) from' , $sql);
		$stmt = $this->oMyConnection->query($sql ); 
		return  $stmt->fetchColumn();	//总记录数	
    }

	/*	────────────── 深度空间 深度学习 ──┐
	方法名：getConnection()
	作  用：得到Connection对象 供countSql函数调用                    
	参  数：
	说  明：	
	日  期：2009/2/28  2010-2-5
	─────────────────── www.itstudy.cn ──┘
	*/
	public function getConnection($oConnection){
		$this->oMyConnection=$oConnection;
	}

	//----- url 参数 获得 --------------
	private function get_url_args(){
		$this->url_args='';
		if(!empty($_SERVER['QUERY_STRING'])){
			$p_n = $this->page_tag . "=" . $this->currentPage;
			$this->url_args=preg_replace( '/^(('.$p_n.')(&)?)|((&)?('.$p_n.'))/i' ,'' ,  $_SERVER['QUERY_STRING']   ) ;

			if($this->url_args!='' ){ $this->url_args.="&" ; }
		}
		return '?'.$this->url_args;
	}

	//----- 首页 上一页 --------------
	public function url_page_first(){
		$strHTML ='';
		// 翻页链接
		if($this->currentPage<=1){
			$strHTML .= "[首页] [上一页] ";
		}else{
			$strHTML .= "[<a href='".$this->url_args.$this->page_tag."=1'>首页</a>] [<a href='".$this->url_args.$this->page_tag."=".($this->currentPage-1)."'>上一页</a>] ";
		}
		return $strHTML;
	}

	//----- 下一页 尾页 --------------
	public function url_page_end(){
		$strHTML ='';
		// 翻页链接
		if( $this->currentPage >= $this->pageCount) {
			$strHTML .= "[下一页] [尾页]";
		}
		else{
			$strHTML .= "[<a href='".$this->url_args.$this->page_tag."=".($this->currentPage+1)."'>下一页</a>] [<a href='".$this->url_args.$this->page_tag."=".$this->pageCount."'>尾页</a>] ";
		}
		return $strHTML;
	}

	//----- [页次:4/649] [共12977条 20条/页] 转到页 go --------------
	public function url_page_info(){
		$strHTML ='';
		 $strHTML .=" [页次:<font color='red'>" . $this->currentPage . "</font>/" . $this->pageCount ;
		 $strHTML .="] [共". $this->resultCount . "条 <font color='red'>". $this->pageSize . "</font>条/页]";
	
		$strHTML .=" 转到<input name='page' value='" . $this->currentPage . "' id='deep_page_go' style='width:30px;'/>页<input type='submit' value='go' onclick=\"document.location='".$this->url_args. $this->page_tag."='+document.getElementById('deep_page_go').value;\" />";
		return $strHTML;
	}

	// 效果  1 2 3 4 ...
	public function url_nav_num(){
		$strHTML ='';
                $this->url_args=$this->get_url_args();		//url 参数 获得
		//当总页数小于10 --------------------------
			if($this->pageCount < 10)
			{
				for($i=1; $i <= $this->pageCount; $i++)
				{
					if($this->currentPage == $i)
					{
						$strHTML .= ' <a href="'.$this->url_args.$this->page_tag."=".$i.'" style="color:#f00">'.$i.'</a> ';
					}else{
						$strHTML .= ' <a href="'.$this->url_args.$this->page_tag."=".$i.'">'.$i.'</a> ';
					}
				}
			}else{
				if($this->currentPage==1 or $this->currentPage==2 or $this->currentPage==3)
				{
					$m = 1;
					$b = 7;
				}
				//如果页面大于前三页并且小于后三页则显示当前页前后各三页链接
				if($this->currentPage>3 and $this->currentPage<$this->pageCount-2)
				{
					$m = $this->currentPage-3;
					$b = $this->currentPage+3;
				}
				//如果页面为最后三页则显示最后7页链接
				if($this->currentPage==$this->pageCount or $this->currentPage==$this->pageCount-1 or $this->currentPage==$this->pageCount-2)
				{
					$m = $this->pageCount - 7;
					$b = $this->pageCount;
				}
				if($this->currentPage > 4)
				{
					$strHTML .= '<a href="'.$this->url_args.$this->page_tag."=".($this->currentPage-4).'">...</a>';
				}
				//显示数字页码
				for($i=$m; $i<=$b; $i++)
				{
					if($this->currentPage == $i)
					{
						$strHTML .= ' <a href="'.$this->url_args.$this->page_tag."=".$i.'" style="color:#f00">'.$i.'</a> ';
					}else{
						$strHTML .= ' <a href="'.$this->url_args.$this->page_tag."=".$i.'">'.$i.'</a> ';
					}
				}
				if($this->currentPage < $this->pageCount-3)
				{
					$strHTML .= '<a href="'.$this->url_args.$this->page_tag."=".($this->currentPage+4).'">...</a>';
				}
			}
		return $strHTML;
	}

	//	效果 	[首页] [上一页] [下一页] [尾页]
	public function url_nav_page(){
		$strHTML ='';
		$this->url_args=$this->get_url_args();		//url 参数 获得
		// 翻页链接
		$strHTML .=$this->url_page_first();
		$strHTML .=$this->url_page_end();

		return $strHTML ;
	}
	
	// 效果	[首页] [上一页] [下一页] [尾页] [页次:1/3] [共299条 100条/页] 转到1页go
	public function url_nav_easy(){
		$strHTML ='';
		$this->url_args=$this->get_url_args();		//url 参数 获得
		// 翻页链接
		$strHTML .=$this->url_page_first();
		$strHTML .=$this->url_page_end();
		$strHTML .=$this->url_page_info();		

		return $strHTML ;
	}

	// 效果	[首页] [上一页] 1 2 3 [下一页] [尾页] [页次:1/3] [共299条 100条/页] 转到1页go
	public function url_nav_all(){
		$strHTML ='';
		$this->url_args=$this->get_url_args();		//url 参数 获得
		// 翻页链接		
		$strHTML .=$this->url_page_first();
		//显示页数字
		$strHTML .=$this->url_nav_num();
		$strHTML .=$this->url_page_end();
		$strHTML .=$this->url_page_info();		
	
		return $strHTML ;
	}



}// --- class end ---